<?php
namespace common\components\sms;

use yii\base\Component;

/**
 * Class Sms
 * @package common\components\Sms
 * 短信平台开发接口
 * >0	成功
-1	账号/密码或企业ID错误
-2	缺少企业账号
-3	缺少密码
-4	缺少短信内容(彩信标题)
-5	缺少目标号码
-6	缺少产品类型
-7	短信内容过长(小灵通最大56个字)，或彩信标题过长(最大30个字符)
-8	短信内容(彩信标题)含有非法字符，第二行返回非法关键词（换行使用\r\n）
-9	目标号码格式错误
-10	超过规定发送时间，禁止提交发送
-11	产品类型错误
-12	余额不足
-14	号码超过发送数量限制
-15	短信内容(彩信标题)前面需加签名，例如【XXX公司】，签名必须放在最前面，如果内容的编码错误，出现乱码，识别不出签名【XXX公司】，也会返回-15
-16	提交号码数量小于最小提交量限制
-17	查询速度过快
-18	tms文件格式错误
-19	无查看回执权限
-20	未开通接口
-21	系统繁忙
-22	短信内容(彩信标题)签名不正确
-23	IP鉴权失败
-24	缺少企业ID
-99	连接失败
-100	系统内部错误
 */
class Sms extends Component
{

    /**
     * @var string
     */
    public $isSmsEnabled = false;
    /**
     * @var string
     */
    /**
     * @var string
     */
    public $modelClass = '\common\models\Sms';


    private $signName = "【兆亿分】";
    /**
     * @var string
     */
    private $smsUrl = 'http://42.96.248.183:8080/sendsms.php?userid=100726&username=BKZFKH&password=<b[:Il(V';



    /**
     * @param $mobile
     * @param $message
     * @param bool $isSaveSms 是否保存短信内容
     * @return int|string
     */
    public function send($mobile, $message, $isSaveSms = false)
    {
        if (!$this->isSmsEnabled){
            return -999; //不调用短信接口;
        }

        try {
            $_mobile = str_replace(" ", "", ("&mobile=" . $mobile));
            $_content = "&message=" . iconv("UTF-8", "gbk//IGNORE", str_replace(" ", "", ($this->signName . $message)));
            $_url = $this->smsUrl . $_mobile . $_content;

            $_responeCode = file_get_contents($_url);

            if ($_responeCode > 0 && $isSaveSms) {
                $this->afterSendSms($mobile, $_url, $_responeCode);
            }
            return $_responeCode;


        } catch (Exception $exc) {
            return -444;
        }
    }

    /**
     * @param $mobile
     * @param $content
     * @param $responseCode
     * 保存短信内容到短信表 zyf_Sms;
     */
    private function afterSendSms($mobile, $content, $responseCode)
    {
        $model = $this->getModel('verifyCode',$mobile, $content);
        if (!$model) {
            $model = new $this->modelClass;
            $model->phones = $mobile;
            $model->body = $content;
            $model->responseCode = $responseCode;
            $model->save(false);
        }
    }

    /**
     * @param $key
     * @return mixed
     */
    protected function getModel($smsType, $phone,$content)
    {
        $query = call_user_func($this->modelClass . '::find');
        return $query->where(['smsType' => $smsType, 'phones' => $phone,
            'body' => $content])->one();
    }
}
